// package com.wing.file.interceptor;
//
// import com.wing.file.service.FileService;
// import org.aopalliance.intercept.Invocation;
// import org.apache.ibatis.binding.MapperMethod;
// import org.apache.ibatis.executor.Executor;
// import org.apache.ibatis.mapping.BoundSql;
// import org.apache.ibatis.mapping.MappedStatement;
// import org.apache.ibatis.mapping.SqlCommandType;
// import org.omg.PortableInterceptor.Interceptor;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.stereotype.Component;
//
// import java.lang.reflect.Field;
// import java.util.Properties;
// import java.util.regex.Matcher;
// import java.util.regex.Pattern;
//
// import static java.util.regex.Pattern.compile;
//
// /**
//  * mybatis拦截器
//  */
// @Component
// @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
// public class FileInterceptor implements Interceptor {
//
//     Pattern pattern = compile("temp/\\d{4}/\\d{2}/\\d{2}/\\w{32}.\\w+", 32);
//
//     @Autowired
//     private FileService fileService;
//
//     @Override
//     public Object intercept(Invocation invocation) throws Throwable {
//         if (invocation.getTarget() instanceof Executor && invocation.getArgs().length == 2) {
//             final Executor executor = (Executor) invocation.getTarget();
//             // 获取第一个参数
//             final MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
//             final Object paramObj = invocation.getArgs()[1];
//             if (ms.getSqlCommandType() == SqlCommandType.INSERT) {
//                 return this.executeInsert(executor, ms, paramObj);
//             } else if (ms.getSqlCommandType() == SqlCommandType.UPDATE) {
//                 return this.executeUpdate(executor, ms, paramObj);
//             } else if (ms.getSqlCommandType() == SqlCommandType.DELETE) {
//                 return this.executeDelete(executor, ms, paramObj);
//             }
//         }
//
//         return invocation.proceed();
//     }
//
//     @Override
//     public Object plugin(Object o) {
//         return Plugin.wrap(o, this);
//     }
//
//     @Override
//     public void setProperties(Properties properties) {}
//
//
//     /**
//      * 新增操作
//      *
//      * @param executor executor
//      * @param ms       ms
//      * @param paramObj 参数
//      * @return 返回执行结果
//      */
//     private Object executeInsert(final Executor executor, final MappedStatement ms, final Object paramObj) throws Exception {
//         saveTemp(paramObj);
//         return executor.update(ms, paramObj);
//     }
//
//     /**
//      * 更新操作
//      *
//      * @param executor executor
//      * @param ms       ms
//      * @param paramObj 参数
//      * @return 返回执行结果
//      */
//     private Object executeUpdate(final Executor executor, final MappedStatement ms, final Object paramObj) throws Exception {
//         saveTemp(paramObj);
//         return executor.update(ms, paramObj);
//     }
//
//     /**
//      * 删除操作
//      *
//      * @param executor executor
//      * @param ms       ms
//      * @param paramObj 参数
//      * @return 返回执行结果
//      */
//     private Object executeDelete(final Executor executor, final MappedStatement ms, final Object paramObj) throws Exception {
//         // final Field[] fields = paramObj.getClass().getDeclaredFields();
//         // for (final Field field : fields) {
//         //     field.setAccessible(true);
//         //     final String fieldName = field.getName();
//         //     switch (fieldName) {
//         //         case "deleted":
//         //             field.set(paramObj, true);
//         //             break;
//         //         default:
//         //             break;
//         //     }
//         // }
//         return executor.update(ms, paramObj);
//     }
//
//
//     /**
//      * 获取当前sql
//      * @param invocation
//      * @return
//      */
//     private String getSqlByInvocation(Invocation invocation) {
//         final Object[] args = invocation.getArgs();
//         MappedStatement ms = (MappedStatement) args[0];
//         Object parameterObject = args[1];
//         BoundSql boundSql = ms.getBoundSql(parameterObject);
//         return boundSql.getSql();
//     }
//
//     /**
//      * 保存缓存文件
//      * @param paramObj
//      * @return
//      */
//     private void saveTemp(Object paramObj) throws IllegalAccessException {
//
//         Field[] fields = paramObj.getClass().getDeclaredFields();
//         Object et = paramObj;
//
//         if(paramObj instanceof MapperMethod.ParamMap){
//             MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap) paramObj;
//             if(paramMap.containsKey("et")){
//                 et = paramMap.get("et");
//                 fields = et.getClass().getDeclaredFields();
//             }
//         }
//
//         for (final Field field : fields) {
//             field.setAccessible(true);
//             Object object = field.get(et);
//             field.setAccessible(false);
//             if (field.getType().equals(String.class) && object != null) {
//                 Matcher matcher = pattern.matcher(String.valueOf(object));
//                 boolean result = matcher.find();
//                 if(result){
//                     StringBuffer newVal = new StringBuffer();
//                     while(result){//如果匹配成功就替换
//                         String oldVal = matcher.group(0);
//                         String replacement = fileService.tempToFile(oldVal) ? oldVal.replace("temp/", "") : "";
//                         matcher.appendReplacement(newVal, replacement);
//                         result = matcher.find();//继续下一步匹配
//                     }
//                     matcher.appendTail(newVal);
//                     field.setAccessible(true);
//                     field.set(et, newVal.toString());
//                     field.setAccessible(false);
//                 }
//             }
//         }
//     }
// }
